package com.example.common.exception;

import cn.hutool.core.collection.CollectionUtil;
import com.example.common.constant.Constantss;
import com.example.common.exception.exceptionType.ApiInvalidParamException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import java.util.List;
import java.util.Objects;

/**
 * 抛出异常工具类
 *
 * @Author hongshu
 */
public class ThrowableUtils {
    /**
     * 校验参数正确,拼装字段名和值到错误信息
     * 参数验证：方法接收 Spring 框架的 BindingResult 对象，用于检查请求参数的验证结果
     * 错误信息提取：当存在验证错误时，提取第一个错误信息进行处理
     * 错误信息格式化：
     * 对于普通字段验证错误，将字段名与错误信息拼接在一起
     * 对于特殊情况（当被拒绝的值包含 @ 符号时），直接使用默认错误信息
     * 异常抛出：将格式化后的错误信息封装到 ApiInvalidParamException 异常中抛出
     *
     * @param result
     */
    public static void checkParamValide(BindingResult result) {
        if (result != null && result.hasErrors()) {
            StringBuilder builder = new StringBuilder();
            List<FieldError> errors = result.getFieldErrors();
            if (CollectionUtil.isNotEmpty(errors)) {
                FieldError error = errors.get(0);
                // 获取被拒绝的值, 如果被拒绝的值包含 @ 符号, 则使用默认错误信息
                String rejectedValue = Objects.toString(error.getRejectedValue(), "");
                String defMsg = error.getDefaultMessage();
                //排除类上面的注解提示
                if (rejectedValue.contains(Constantss.DELIMITER_TO)) {
                    //自己去确定错误字段
                    builder.append(defMsg);
                } else {
                    if (Constantss.DELIMITER_COLON.contains(defMsg)) {
                        builder.append(error.getField()).append(" ").append(defMsg);
                    } else {
                        builder.append(error.getField()).append(" ").append(defMsg);
                    }
                }
            } else {
                String msg = result.getAllErrors().get(0).getDefaultMessage();
                builder.append(msg);
            }
            throw new ApiInvalidParamException(builder.toString());
        }
    }
}
